/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ec.medical.servicio.impl;

import com.ec.medical.entidades.DivisionGeografica;
import com.ec.medical.entidades.Perfil;
import com.ec.medical.entidades.Prestador;
import com.ec.medical.entidades.Rol;
import com.ec.medical.entidades.Usuario;
import com.ec.medical.enumeracion.ActInaEnum;
import com.ec.medical.enumeracion.RolesEnum;
import com.ec.medical.exepciones.PerfilException;
import com.ec.medical.exepciones.UsuarioException;
import com.ec.medical.servicio.PerfilServicioLocal;
import com.ec.medical.servicio.RolServicioLocal;
import com.ec.medical.servicio.UsuarioServicioLocal;
import com.ec.medical.util.EncriptacionUtil;
import com.ec.medical.util.Utilitarios;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.Query;
import org.apache.log4j.Logger;

/**
 *
 * @author Administrador
 */
@Stateless
public class UsuarioServicioImpl extends ServicioBase<Usuario> implements UsuarioServicioLocal {

    private Logger LOG = Logger.getLogger(UsuarioServicioImpl.class.getName());
    @EJB
    private PerfilServicioLocal perfilServicio;
    @EJB
    private RolServicioLocal rolServicio;

    public UsuarioServicioImpl() {
        super(Usuario.class);
    }

    /**
     * Metodo que recupera un usuario por su username
     *
     * @param usermane
     * @return
     */
    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public Usuario obtenerUsuarioPorUserName(String usermane) {
        Query query = em.createNamedQuery("Usuario.findByUsername");
        query.setParameter("username", usermane);
        return (Usuario) query.getSingleResult();
    }

    /**
     * Metodo que edita un usuario, elimando los perfiles actuales y creando los
     * nuevos
     *
     * @param usuario
     * @param roles
     * @throws UsuarioException
     */
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void editarUsuario(Usuario usuario, List<Rol> roles) throws UsuarioException {
        try {
            usuario.setPassword(EncriptacionUtil.encriptarMD5(usuario.getPassword()));
            this.edit(usuario);

            perfilServicio.eliminarPerfilesDeUsuario(usuario);

            for (Rol rol : roles) {
                Perfil perfil = new Perfil();
                perfil.setUsuario(usuario);
                perfil.setRol(rol);
                perfilServicio.crearPerfil(perfil);
            }

        } catch (PerfilException e) {
            LOG.error(" .. crearNuevoUsuario PerfilException " + e);
            throw new UsuarioException("Error al crear nuevo usuario");
        } catch (Exception e) {
            LOG.error(" .. crearNuevoUsuario Error" + e);
            throw new UsuarioException("Error al crear nuevo usuario");
        }
    }

    /**
     * Actualiza la entidad usuario
     *
     * @param usuario
     * @throws UsuarioException
     */
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void editarUsuario(Usuario usuario) throws UsuarioException {
        try {
            edit(usuario);
        } catch (Exception e) {
            LOG.error(" .. editarUsuario Error " + e);
            throw new UsuarioException("Error al editar usuario");
        }
    }

    /**
     * MEtodo que crea un nuevo usuario con su respectivo perfil de acceso
     * dependiendo del parametro RolesEnum, el parametro codigoDeRelacion es
     * utilizado para los roles CLIENTE - PRESTADOR y contiene la clave foranea
     * a la respectiva entidad
     *
     * @param username
     * @param pass
     * @param rolesEnum
     * @param codigoDeRelacion
     * @param divisionGeografica
     * @throws UsuarioException
     */
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void crearNuevoUsuario(String username, String pass, RolesEnum rolesEnum, Integer codigoDeRelacion, DivisionGeografica divisionGeografica) throws UsuarioException {
        try {
            Usuario usuario = new Usuario();
            usuario.setEstado(ActInaEnum.ACT);
            usuario.setUsername(username);
            usuario.setPassword(EncriptacionUtil.encriptarMD5(pass));
            usuario.setDivisionGeografica(divisionGeografica);
            this.create(usuario);

            Rol rol = rolServicio.obtenerPorIdentificador(rolesEnum.getIdentificador());
            Perfil perfil = new Perfil();
            perfil.setUsuario(usuario);
            perfil.setRol(rol);

           if (!Utilitarios.esNulo(codigoDeRelacion) && rolesEnum.equals(RolesEnum.PRESTADOR)) {
                perfil.setPrestador(new Prestador(codigoDeRelacion));
            }

            perfilServicio.crearPerfil(perfil);

        } catch (PerfilException e) {
            LOG.error(" .. crearNuevoUsuario PerfilException " + e);
            throw new UsuarioException("Error al crear nuevo usuario");
        } catch (Exception e) {
            LOG.error(" .. crearNuevoUsuario Error" + e);
            throw new UsuarioException("Error al crear nuevo usuario");
        }
    }
    
    
}
